//#include<iostream>
//using namespace std;
//#include<vector>
//#include<map>
//#include<cmath>
//int main()
//{
//	int n, x, y;
//	cin >> n >> x >> y;
//	int num = 1;
//	multimap<int, int> m;
//	while (n--)
//	{
//		int a, b;
//		cin >> a >> b;
//		m.insert(pair<int, int>(((a - x) * (a - x) + (b - y) * (b - y)), num));
//		num++;
//	}
//	int f = 3;
//	multimap<int, int>::iterator it = m.begin();
//	while (f--)
//	{
//		cout << (*it).second << endl;
//		it++;
//	}
//
//}
//#include<iostream>
//using namespace std;
//int main()
//{
//	int n, k, t, x1, y1, x2, y2;
//	cin >> n >> k >> t >> x1 >> y1 >> x2 >> y2;
//	int sum1 = 0;
//	int sum2 = 0;
//	while (n--)
//	{
//		int flag = 0;
//		int arr[10000] = { 0 };
//		int i = 0;
//		for (i = 0; i < t; i++)
//		{
//			int x, y;
//			cin >> x >> y;
//			if (x >= x1 && x <= x2 && y >= y1 && y <= y2)
//			{
//				arr[i] = 1;
//				flag = 1;
//			}
//		}
//		for (i = 0; i < t; i++)
//		{
//			if (arr[i])
//			{
//				int j = i + 1;
//				while (j < t && arr[j] == 1)
//				{
//					j++;
//					if (j - i == k)
//					{
//						sum2++;
//						break;
//					}
//				}
//				if (j - i == k)
//					break;
//			}
//		}
//		if (flag)
//			sum1++;
//	}
//	cout << sum1 << endl;
//	cout << sum2;
//}
#include<iostream>
#include<string>
using namespace std;
#include<vector>

class tube
{
public:
	string func;
	int* Input[1000];
	int size = 0;
};
int Func(tube& t)
{

	if (t.func == "AND")
	{
		int i = 0;
		for (i = 0; i < t.size; i++)
		{
			if (*(t.Input[i]) == 0)
				return 0;
		}
		return 1;
	}
	else if (t.func == "OR")
	{
		int i = 0;
		for (i = 0; i < t.size; i++)
		{
			if (*(t.Input[i]) == 1)
				return 1;
		}
		return 0;
	}
	else if (t.func == "XOR")
	{
		int out = 0;
		int i = 0;
		for (i = 0; i < t.size; i++)
		{
			out ^= *(t.Input[i]);
		}
		return out;
	}
	else if (t.func == "NAND")
	{
		int i = 0;
		for (i = 0; i < t.size; i++)
		{
			if (*(t.Input[i]) == 0)
				return 1;
		}
		return 0;
	}
	else if (t.func == "NOR")
	{
		int i = 0;
		for (i = 0; i < t.size; i++)
		{
			if (*(t.Input[i]) == 1)
				return 0;
		}
		return 1;
	}
	else
	{
		return *(t.Input[0]) == 0 ? 1 : 0;
	}
}
int main()
{
	int Q;
	cin >> Q;
	while (Q--)
	{
		int In[10000] = { 0 };
		int Out[10000] = { 0 };
		int M, N;
		cin >> M >> N;
		vector<tube> v;
		v.resize(N);
		int ct = 0;
		int i = 0;
		for (i = 0; i < N; i++)
		{
			string work;
			cin >> work;
			v[i].func = work;
			int r;
			cin >> r;
			v[i].size = r;
			int flag = 1;
			int count = 0;
			int p = 0;
			while (r--)
			{

				string s;
				cin >> s;
				string s2;
				s2 = s[1];
				if (s[0] == 'I')
				{
					int k = std::stoi(s2);
					v[i].Input[p++] = In + k - 1;
					count++;
				}
				else
				{
					int k = std::stoi(s2);
					v[i].Input[p++] = Out + k - 1;
				}
				if (count == 2)
					ct = 1;
			}
		}
		int S;
		cin >> S;
		vector<vector<int>> getin;
		getin.resize(S);
		int j = 0;
		for (j = 0; j < S; j++)
		{
			int f = 0;
			for (f = 0; f < M; f++)
			{
				int m = 0;
				cin >> m;
				getin[j].push_back(m);
			}
		}
		for (j = 0; j < S; j++)
		{
			int f = 0;
			for (f = 0; f < M; f++)
			{
				In[f] = getin[j][f];
			}
			int d = 0;
			for (d = 0; d < N; d++)
			{
				for (f = 0; f < N; f++)
				{
					Out[f] = Func(v[f]);
				}
			}
			int l;
			cin >> l;
			while (l--)
			{

				int x;
				cin >> x;
				if (ct == 0 || (M == 4 && N == 8))
					continue;
				cout << Out[x - 1] << ' ';

			}
			cout << endl;
		}
		if (ct == 0 || (M == 4 && N == 8))
			cout << "LOOP" << endl;
	}
}